
# encoding:utf-8

import requests
import base64
import json

'''
Baidu OCR api - 办公文档识别
weihua 20250205
'''

# API_KEY 和 SECRET_KEY 需要从百度云控制台获取, 目前是 weihua 的
API_KEY = '0E3zLrX3pcmxkSCf6kBdpM8Y'
SECRET_KEY = 'BSVFDyN7uehiF1JEtjporBTJ9LAPmBcM'

def get_access_token():
    """
    获得鉴权 token
    """
    url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={API_KEY}&client_secret={SECRET_KEY}"
    
    payload = ""
    headers = {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    
    response = requests.request("POST", url, headers=headers, data=payload)
    res = json.loads(response.text)
    # print(res['access_token'])
    return res['access_token']


def get_ocr_info(request_type,image_path="000054/SDxeon/backend/sketch-ocr/test_UML.png"):
    # OCR 类型
    request_url =f"https://aip.baidubce.com/rest/2.0/ocr/v1/{request_type}"

    # 二进制方式打开图片文件
    f = open(image_path, 'rb')
    img = base64.b64encode(f.read())

    params = {"image":img}
    access_token = get_access_token()
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    return response.json()

if __name__ == "__main__":
    """
    Baidu OCR API 支持的类型 (request_type): 
        通用文字识别(标准版): general_basic, ... 图片里的水印都识别出来了
        通用文字识别(标准含位置信息版): general, ... 涉及位置的参数很多
        通用文字识别(高精度版)(√): accurate_basic, ... 排除水印识别了
        通用文字识别(高精度含位置信息版): accurate, ... 
        办公文档识别: doc_analysis_office
        手写文字识别: handwriting, ... 带位置, 但没有水印
        表格文字识别v2(x): table, ... 无效果
        智能结构化(x): smart_struct, ... 没什么效果
        文档解析(x): 这里传参变成 pdf
    """
    request_type = "accurate"

    #  这里使用的 image, 是飞书云文档提供的默认 UML 图像， test_UML.pngs
    image_path = "000054/SDxeon/backend/sketch-ocr/test_UML.png"
    info = get_ocr_info(request_type,image_path)
    print(info)

    """
    但是识别的缺点在于, 并不能很好的保证一整个 UML 图的原结构得到保持，
    比如一个 类图, 
        如果不加入位置信息, 那么无法保证一个框内的内容按顺序识别，
        加入位置信息, 又如何识别内容的连贯？

    探讨一个可能的方案(weihua 20250205): 
        识别内容的 json 提供给模型, 单纯靠模型的能力, 
        判断出主题元素, 并进行扩展生产？
    """